package com.mindbook.vip.gawxchatinfo.config.shiro;

import org.apache.shiro.authz.Authorizer;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.PrincipalCollection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

/**
 * @Author wxb
 * @Datatime 2022/4/12 16:09
 * @Descript 自定义处理 多realm 授权校验 访问多个realms的问题
 *  在多realm中，一般请求会访问多个realm，因为在此处返回了多个realm。实际，并不需要多个realm，只返回一个即可。
 */
public class CustomModularRealmAuthorizer extends ModularRealmAuthorizer {

    @Override
    public boolean isPermitted(PrincipalCollection principals, String permission) {

        //获取当前所包含的realms
        Set<String> realmNames = principals.getRealmNames();
        //遍历realms。（此时应该有且只有一个realms）
        List<Realm> list = new ArrayList<>();
        Realm realm = null;
        for(String s: realmNames){
            if(s.equals("UserBackRealm")){
                realm = new UserBackRealm();
            }else if(s.equals("UserFrontRealm")){
                realm = new UserFrontRealm();
            }else{
                realm = null;
            }
            list.add(realm);
        }

        //父类中拿过来的
        Iterator var3 = list.iterator();
        do {
            if (!var3.hasNext()) {
                return false;
            }

            realm = (Realm)var3.next();
        } while(!(realm instanceof Authorizer) || !((Authorizer)realm).isPermitted(principals, permission));
        return true;
    }
}
